#ifndef SIMULADOR_H
#define SIMULADOR_H
#include <vector>
#include <set>
#include <fstream>

#include "evento.h"
#include "filaEspera.h"

using namespace std;

struct dados{
  double eW1, eW2, eT1, eT2, vW1, vW2, eN1, eN2, eNq1, eNq2;
};

class Simulador{

  private:
    ///rodada - guarda os valores de uma rodadas
    ///somaRodada - guarda o somatorio das rodadas
    ///somaQuadRodada - guarda o somatorio dos quadrados das rodadas
    struct dados somaRodada, somaQuadRodada, rodada, geral;
    FilaEspera *fila1, *fila2;       ///Filas de espera que armazenam os clientes
    double lambda, mi;               ///Taxa de chegada e taxa de servico
    double instanteAtual;
    unsigned int tamanhoRodada;      ///Tamanho de uma rodada, numero de cliente que serao atendidos em uma rodada
    vector<Cliente *> atendidos;     ///Todos os clientes que ja foram atendidos, utilizado posteriormente para a coleta de dados
    Cliente *servidor;               ///Servidor que aponta para o cliente que esta sendo
    int rodadasSimuladas, rodadasGuardadas;
    vector<struct dados> v_rodada;

    /** Lista de eventos responsavel por guardar os eventos com prioridade para aqueles com o menor tempo */
    set<Evento, less_equal<Evento> > listaEventos;


  public:
    /** Construtor */
    Simulador(char tipoFila1, char tipoFila2, double taxaChegada, double taxaServico);

    /** Destrutor */
    ~Simulador();

    /** Inicializa os dados do simulador */
    void inicializa();

    /** Executa o simulador */
    void executa(long int rodadaAtual, unsigned int tamanhoRodada);

    /** Calcula as esperancas para cada rodada da simulacao */
    void calculaDadosRodada();

    /** Imprime os resultados da Rodada*/
    void imprimeDadosRodada();

    /** Armazena os dados de uma rodada */
    void guardaDadosRodada();

    /** Calcula as esperancas para de todas as rodadas da simulacao */
    void calculaDadosGerais();

    /** Imprime os resultados todas as rodadas da simulacao */
    void imprimeDadosGerais();

    /** Gera todos os valores necessarios para a frase transiente */
    void geraDadosFaseTransiente();

    /** Imprime todos os valores gerados na frase transiente */
    void imprimeDadosFaseTransiente(ofstream &file);

    void geraIntervaloConfianca();

};

#endif // SIMULADOR_H
